/**
 *
 */
import CryptoJS from "crypto-js";
/**
 *
 */
import AES from "crypto-js/aes.js";
/**
 *
 */
import { h } from "vue";
/**
 *
 */
import { MenuOption, NIcon } from "naive-ui";
/**
 *
 */
import { RouteRecordRaw } from "vue-router";

/**
 *
 * @param pwd 加密前密码，应为字符串类型
 * @param timestamp 时间戳用于构成 密钥，应为字符串或者数字类型（如果需要转换为字符串参与加密）
 * @param iv 服务端给定的加密向量，默认为字符串类型，默认值为'4e3dada4c2d8afc0'
 * @returns 加密后的密码，返回Base64编码后的字符串
 */
export function cryptoPwd(
  pwd: string,
  timestamp: string | number,
  iv: string = "4e3dada4c2d8afc0"
): string {
  const aesCrypto = CryptoJS.AES.encrypt(
    CryptoJS.enc.Utf8.parse(pwd),
    CryptoJS.enc.Utf8.parse(`dcs${timestamp}`),
    {
      iv: CryptoJS.enc.Utf8.parse(iv),
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7,
    }
  );
  return CryptoJS.enc.Base64.stringify(aesCrypto.ciphertext);
}

/**
 * 根据当前权限 生成对应的侧边栏菜单
 * @param routes vue-router路由映射表
 * @param auth 拥有的权限数组
 * @returns 侧边菜单对象数组
 */
export function routesToMenu(routes: RouteRecordRaw[]): any[] | undefined {
  if (routes.length) {
    return routes
      .map((route) => {
        return {
          label: route.meta!.label,
          icon: route.meta!.icon,
          key: route.name as string,
          children: route.children?.length
            ? routesToMenu(route.children)
            : undefined,
        };
      })
      .filter((f) => f);
  }
  return undefined;
}

/**
 * 转图片
 * @param {*} icon
 * @returns
 */
export function renderIcon(icon: any) {
  return () => {
    return h(NIcon, null, {
      default: () => h(icon),
    });
  };
}

/**
 * DFS 深度优先查询 查询到对应key值的节点并返回
 * @param tree MenuOption类型数组
 * @param target 目标key值
 * @returns 对应的节点
 */
export function searchMenuItem(tree: MenuOption[], target: string) {
  // 模拟栈，管理结点
  let stack = [...tree];
  while (stack.length) {
    // 栈顶节点出栈
    let node = stack.shift()!;
    // 查找到目标，退出
    if (node.key === target) {
      return node;
    }
    if (node.children && node.children.length) {
      // 将候选顶点入栈，进行下一次循环
      stack.push(...node.children.reverse());
    }
  }
}
